//
//  StaticTimeScheduler.h
//  location
//
//  Created by Assistant on 2025/10/15.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/// 一个简单的串行任务调度器：
/// - 单一串行队列，避免并发导致的 CPU 抢占
/// - 按 userId 合并（last-write-wins），同一用户短时间多次触发仅保留最后一次
/// - 完成后回主线程执行 apply 回调以便安全更新 UI
@interface StaticTimeScheduler : NSObject

+ (instancetype)shared;

/// 入队一个“静止起始时间”计算任务（或任意自定义任务）。
/// 
/// 参数说明：
/// - userId: 用于合并的键（同一 userId 仅保留最后一次任务参数）
/// - location: 透传给 worker 的上下文参数
/// - worker: 在后台线程执行的异步任务；完成后必须调用 complete 回调（可传 nil）
/// - apply: 在主线程执行的 UI 更新回调；接收 worker 产出的结果
- (void)enqueueWithUserId:(NSString *)userId
                 location:(nullable NSDictionary *)location
                   worker:(void (^)(NSString *userId,
                                     NSDictionary * _Nullable location,
                                     void (^complete)(NSString * _Nullable startTime)))worker
                    apply:(void (^)(NSString * _Nullable startTime))apply;

/// 取消某个用户的待处理任务（已经在执行的不会被打断）
- (void)cancelPendingForUserId:(NSString *)userId;

/// 清空所有待处理任务
- (void)cancelAllPending;

@end

NS_ASSUME_NONNULL_END


